/* 字符串 */

// 用 '' 或 "" 括起来
// 反斜杠 \ 是转义字符

// ASCII 字符可以用 "\x##" 形式的十六进制表示
'\x6162';   // -> 'a62'
'\x61\x62'; // -> 'ab'

// Unicode 字符用 '\u####' 表示
'\u4e2d\u6587'; // -> '中文'

// * 在最新的 ES6(ECMAScript 6) 标准中
// 多行字符除了使用 '\n' 换行，还可以用反引号 `...` 表示
`This is a string
 这是一个多行字符串`; // 那个空格也会算进去

/* 模板字符串 */
'use strict'
// 连接字符串可以用 + 号
var usrname = 'lucca';
var year = '9102';
var msg = 'Hello ' + usrname + year;

alert(msg);

// 在 ES6 中，也可以用模板字符串表示：
var msg2 = `Hello ${usrname}${year}, welcome back`;

/* 操作字符串 */
'use strict';
var s = "Hello World!";

/* 长度和索引 */
s.length;  // -> 12
s["length"]  // -> 12

s[0];   // -> 'H'
s[6];   // -> 'W'
s[18];  // -> undefined

/* 大小写转换 */
// 小写
var lower = s.toLowerCase();
lower;  // -> "hello world!"
// 大写
var upper = s.toUpperCase();
upper;  // -> "HELLO WORLD!"

/* 搜索指定字符串 */
// s.indexOf(subs) -> 返回子字符串出现的位置（第一个字符）
//   不存在时返回 -1
var beginPos = 0    // 开始搜索的位置，0 到 s.length - 1
s.indexOf('o', beginPos);   // -> 4
beginPos = 5;
s.indexOf('o', beginPos);   // -> 7

s.indexOf("Hello"); // -> 0

/* 子字符串（感觉类似切片） */
s[0, 2, 8];
// 这种神秘的表达方式不会报错，但是会返回最后一个数字代表的字符
// 例如以上表达式返回 'r'

// 正确的做法是：
var startnum = 2;
var endnum = 5;
s.substring(startnum, endnum);  // -> 'llo' (不包含 end 位置的字符)

// 或者
s.substring(startnum);  // -> "llo World!" (从 startnum 到最后)

// 还有
var length = 3;
s.substr(startnum, length); // -> 'llo' (从 startnum 开始，取 3 个字符)

s.substr(startnum); // -> "llo World!" (从 startnum 到最后)

// * 如果以上不向两个函数传递参数，则会截取整个字符串。
//   可以使用这个方法复制字符串